package uva.sc.qls.typeChecker; import java.util.ArrayList; import java.util.List; import uva.sc.ql.gui.GUIVisitor; import uva.sc.qls.ast.IQLSNodeVisitor; import uva.sc.qls.ast.IQLSNode; import uva.sc.qls.logic.ID; import uva.sc.qls.logic.Page; import uva.sc.qls.logic.Question; import uva.sc.qls.logic.Section; import uva.sc.qls.logic.SectionBody; import uva.sc.qls.logic.StyleSheet; import uva.sc.qls.logic.Widget; import uva.sc.qls.logic.fonts.Arial; import uva.sc.qls.logic.fonts.Bazooka; import uva.sc.qls.logic.fonts.BookAntiqua; import uva.sc.qls.logic.fonts.Courier; import uva.sc.qls.logic.fonts.Dialog; import uva.sc.qls.logic.fonts.TimesNewRoman; import uva.sc.qls.logic.fonts.UndefinedFont; import uva.sc.qls.logic.style.DefaultStyle; import uva.sc.qls.logic.style.StyleProperty; import uva.sc.core.INode; import uva.sc.core.types.Boolean; import uva.sc.core.types.Number; import uva.sc.core.types.String; import uva.sc.core.types.Type; import uva.sc.core.types.Undefined; import uva.sc.qls.widgetTypes.Checkbox; import uva.sc.qls.widgetTypes.Radio; import uva.sc.qls.widgetTypes.Spinbox; import uva.sc.qls.widgetTypes.UnidentifiedWidget; import uva.sc.qls.widgetTypes.WidgetType; public class TypeCheckerVisitor implements IQLSNodeVisitor<INode> { List<java.lang.String> errors; List<java.lang.String> placedQuestions; GUIVisitor qlGUIVisitor; public TypeCheckerVisitor() { this.errors = new ArrayList<java.lang.String>(); this.placedQuestions = new ArrayList<java.lang.String>(); } public TypeCheckerVisitor(GUIVisitor visitor) { qlGUIVisitor = visitor; this.errors = new ArrayList<java.lang.String>(); this.placedQuestions = new ArrayList<java.lang.String>(); System.out.println(qlGUIVisitor.getComponentList()); } public List<java.lang.String> getErrors() { return errors; } public List<java.lang.String> getPlacedQuestions() { return placedQuestions; } public StyleSheet visit(StyleSheet styleSheet) { ID id = styleSheet.getId(); id.accept(this); for (Page page : styleSheet.getPages()) { page.accept(this); } return null; } public Page visit(Page page) { ID id = page.getId(); id.accept(this); for (Section section : page.getSections()) { section.accept(this); } if (page.getDefaultStyle() != null) { DefaultStyle defaultStyle = page.getDefaultStyle(); defaultStyle.accept(this); } return null; } public DefaultStyle visit(DefaultStyle defaultStyle) { Type type = defaultStyle.getType(); Widget widget = defaultStyle.getWidget(); Type widgetType = (Type) widget.accept(this); if (!type.equals(widgetType)) { errors.add("Widget incompatibility, cannot resolve type <" + type.toString() + "> to widget type <" + widget.getWidgetType().toString() + ">"); } for (StyleProperty styleProperty : defaultStyle.getStyleProperty()) { styleProperty.accept(this); } widget.accept(this); return null; } public Question visit(Question question) { java.lang.String questionId = question.getId().toString(); if (!placedQuestions.contains(questionId)) { placedQuestions.add(questionId); } else { errors.add("Duplicated question <" + questionId + ">"); } ID id = question.getId(); id.accept(this); if (question.getWidget() != null) { Widget widget = question.getWidget(); widget.accept(this); } return null; } public Section visit(Section section) { SectionBody sectionBody = section.getSectionBody(); sectionBody.accept(this); return null; } public SectionBody visit(SectionBody sectionBody) { for (Question question : sectionBody.getQuestions()) { question.accept(this); } for (Section section : sectionBody.getSections()) { section.accept(this); } if (sectionBody.getDefaultStyle() != null) { DefaultStyle defaultStyle = sectionBody.getDefaultStyle(); defaultStyle.accept(this); } return null; } public Type visit(Widget widget) { WidgetType widgetType = widget.getWidgetType(); widgetType = (WidgetType) widgetType.accept(this); return widgetType.getType(); } public StyleProperty visit(StyleProperty styleProperty) { return null; } public Boolean visit(Boolean bool) { return null; } public IQLSNode visit(String str) { return null; } public IQLSNode visit(Number number) { return null; } public IQLSNode visit(Undefined unidentified) { return null; } public IQLSNode visit(ID id) { return null; } public IQLSNode visit(UnidentifiedWidget unidentifiedWidget) { return null; } public Checkbox visit(Checkbox checkbox) { return new Checkbox(); } public Spinbox visit(Spinbox spinbox) { return new Spinbox(); } public Radio visit(Radio radio) { return new Radio(); } public IQLSNode visit(Arial arial) { return new Arial(); } public IQLSNode visit(Bazooka bazooka) { return new Bazooka(); } public IQLSNode visit(BookAntiqua bookAntiqua) { return new BookAntiqua(); } public IQLSNode visit(Courier courier) { return new Courier(); } public IQLSNode visit(Dialog dialog) { return new Dialog(); } public IQLSNode visit(TimesNewRoman timesNewRoman) { return new TimesNewRoman(); } public IQLSNode visit(UndefinedFont undefinedFont) { return new UndefinedFont(); } }